﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest)
	{
		dest++;
	}
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}


//int main()
//{
//	char str1[] = "hello";
//	char str2[] = "world";
//	printf("%s\n", my_strcat(str1, str2));
//
//	return 0;
//}



char* my_strstr(const char* str, const char* substr)
{
	const char* s1 = str;
	const char* s2 = substr;
	const char* cur = str;

	assert(str && substr);
	if (*substr == '\0')
	{
		return (char*)str;
	}
	while (*cur)
	{
		s1 = cur;
		s2 = substr;
		while (*s1 &&  *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return (char*)cur;

		cur++;
	}
	return NULL;
}

//int main()
//{
//	char arr1[] = "abbbcdef";
//	char arr2[] = "bbcq";
//
//	char* ret = my_strstr(arr1, arr2);
//
//	if (NULL == ret)
//		printf("没找到\n");
//	else
//		printf("%s\n", ret);
//
//	return 0;
//}



void* my_memmove(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	
	if (dest < src)
	{
		//前->后
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		//后->前
		while (num--)
		{
			*((char*)dest+num) = *((char*)src + num);
		}
	}
	return ret;
}

//
//int main()
//{
//	int arr3[] = { 1,2,3,4,5,6,7,8,9,10 };
//	my_memmove(arr3, arr3 + 2, 20);
//
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr3[i]);
//	}
//}



void* my_memcpy(void* dest, const void*src, size_t num)
{
	void* ret = dest;
	assert(dest && src);

	while (num--) 
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}

	return ret;
}

//
//
//int main()
//{
//	int arr3[] = { 1,2,3,4,5,6,7,8,9,10 };
//	my_memcpy(arr3 + 2, arr3, 5 * sizeof(arr3[0]));
//
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr3[i]);
//	}
//}


//#define SwapIntBit(n) (((n) & 0x55555555) << 1 | ((n) & 0xaaaaaaaa) >> 1)
//
//int main()
//{
//	printf("%d\n",SwapIntBit(5));
//
//	return 0;
//}




//#define offsetof(StructType, MemberName)  (size_t)&(((StructType *)0)->MemberName)
struct num {
	int a;
	double d;
	char c;
};



//int main()
//{
//	struct num cat = { 1,1.2,'c'};
//
//	printf("%d\n", offsetof(cat, cat.c));
//
//	return 0;
//}



/*
1、空指针
2、空字符串
3、空白字符
4、+-
5、非数字字符
6、超大数字
*/
#include <assert.h>
#include <ctype.h>
#include <stdlib.h>

enum State
{
	INVALID,
    VALID
};

enum State staus = INVALID;

int my_atoi(const char* str)
{
	assert(str);

	//空字符串
	if (*str == '\0')
		return 0;

	//空白字符,跳过
	//isspace是判断是否为空白字符的函数
	while (isspace(*str))
	{
		str++;
	}

	int flag = 1;
	//处理+-
	if (*str == '+')
	{
		flag = 1;
		str++;
	}
	else if (*str == '-')
	{
		flag = -1;
		str++;

	}

	//判断是否为数字字符
	long long n = 0;
	while (isdigit(*str))
	{
		n = (*str - '0') *flag + n * 10;
		//超大值，无法转换
		if (n > INT_MAX || n < INT_MIN)
		{
			return 0;
		}
		
		str++;
	}

	if (*str == '\0')
	{
		staus = VALID;
		return (int)n;
	}

	return (int)n;
}

//int main()
//{
//	int ret = my_atoi("123");
//	if (staus == VALID)
//		printf("%d\n", ret);
//	else
//		printf("非法返回");
//
//	return 0;
//
//}



char* mystrncat(char* dst, const char* src, int n)
{
	char* tmp = dst;

	while (*dst)
	{
		dst++;
	}

	int i = 0;;
	for (i = 0; src[i] && i < n; i++)
	{
		dst[i] = src[i];
	}

	dst[i] = 0;
	return tmp;
}



char* mystrncpy(char* dst, const char* src, int n)
{
	int i;
	for (i = 0; src[i] && i < n; i++)
	{
		dst[i] = src[i];
	}

	if (i < n)
	{
		dst[i] = 0;
	}
	return dst;
}

//int main()
//{
//	char arr1[20] = "bit";
//	char arr2[] = "bite";
//	printf("%s\n", mystrncpy(arr1, arr2, 3));
//}


